package aboutInterface

import "fmt"

// 接口不管你是什么类型，它只管你实现什么方法
// 只要实现了 say 方法，都是sayer类型
type sayer interface {
	say()
}

// 接口是一系列方法的集合

type dog struct{}

func (d dog) say() {
	fmt.Println("dog wang wang")
}

type cat struct{}

func (c cat) say() {
	fmt.Println("cat miao miao")
}

type person struct {
	name string
	age  int
}

// 接收者类型是指针
func (p *person) say() {
	fmt.Println("person hei hei hei")
}

func index() {
	c1 := cat{}
	c1.say()
	d1 := &dog{}
	d1.say()
	p := &person{}

	var s1 sayer
	s1 = p

	var s sayer
	s = c1
	var s2 sayer
	s2 = d1
	fmt.Println(s, s2)

	//	定义一个可以有任何value的map
	var m = make(map[string]interface{}, 10)

	// 类型断言, 变量.(类型)
	duanyan, ok := s2.(dog)
	if !ok {

	} else {
		fmt.Print(duanyan)
	}
}

type A interface {
	sayer
	run()
}

// 空接口(接口中没有定义任何需要实现的方法) ，任何类型都实现了空接口，空接口可以存储任何类型的值
// 空接口的应用 1. 空接口可以作为函数参数，空接口可以作为有任何value的map